package com.cneport.das.common.utils;

import cn.hutool.core.util.StrUtil;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author GavinZhang
 * @version 1.0
 * @desc： 字符串处理工具
 * @company 东方物通科技有限（北京）公司
 * @date 2021/7/26 15:13
 */
public class StringUtil {
    /**
     * 将不可见的字符串也判定为空
     *
     * @param charSequence
     * @return
     */
    public static boolean isBlank(CharSequence charSequence) {
        return StrUtil.isBlank(charSequence);
    }

    /**
     * 只判定 null和 “”
     *
     * @param charSequence
     * @return
     */
    public static boolean isEmpty(CharSequence charSequence) {
        return StrUtil.isEmpty(charSequence);
    }

    /**
     * 格式化字符串
     *
     * @param template
     * @param params
     * @return
     */
    public static String format(CharSequence template, Object... params) {
        return StrUtil.format(template, params);
    }

    /**
     * 格式化字符串
     *
     * @param template
     * @param params
     * @return
     */
    public static String format(CharSequence template, Map<?, ?> params) {
        return StrUtil.format(template, params);
    }

    /**
     * 格式化字符串
     *
     * @param template
     * @param params
     * @param ignoreNull
     * @return
     */
    public static String format(CharSequence template, Map<?, ?> params, boolean ignoreNull) {
        return StrUtil.format(template, params, ignoreNull);
    }

    /**
     * 删除后缀
     *
     * @param str
     * @param suffix
     * @return
     */
    public static String removeSuffix(CharSequence str, CharSequence suffix) {
        return StrUtil.removeSuffix(str, suffix);
    }

    /**
     * 删除后缀，忽略大小写
     *
     * @param str
     * @param suffix
     * @return
     */
    public static String removeSuffixIgnoreCase(CharSequence str, CharSequence suffix) {
        return StrUtil.removeSuffixIgnoreCase(str, suffix);
    }

    /**
     * 删除前缀
     *
     * @param str
     * @param prefix
     * @return
     */
    public static String removePrefix(CharSequence str, CharSequence prefix) {
        return StrUtil.removePrefix(str, prefix);
    }

    /**
     * 删除前缀，忽略大小写
     *
     * @param str
     * @param prefix
     * @return
     */
    public static String removePrefixIgnoreCase(CharSequence str, CharSequence prefix) {
        return StrUtil.removePrefixIgnoreCase(str, prefix);
    }

    /**
     * 统计字符串中子字符串的个数
     *
     * @param string 源字符串
     * @param a      需要匹配的字符串
     * @return List中最后一个元素为匹配个数，前面的为各个下标起始值
     */
    public static List<Integer> peerStr(String string, String a) {
        List<Integer> result = new ArrayList<>();

        int counter = 0;
        for (int i = 0; i <= string.length() - a.length(); i++) {
            if (string.substring(i, i + a.length()).equals(a)) {
                counter++;
                result.add(i);
            }
        }
        result.add(counter);
        return result;

    }

    /**
     * 从字符串的指定位置替换指定的子字符串，区分大小写。
     *
     * @param srcStr     源字符串
     * @param startIndex 开始位置
     * @param oldStr     搜索子字符串
     * @param newStr     替换子字符串
     * @return
     */
    public static String replaceStr(String srcStr, int startIndex, String oldStr, String newStr) {
        return StrUtil.replace(srcStr, startIndex, oldStr, newStr, false);
    }

    /**
     * 截取指定位置间的子字符串
     *
     * @param srcStr 源字符串
     * @param start  开始位置
     * @param end    结束位置
     * @return 子字符串
     */
    public static String subStr(String srcStr, int start, int end) {
        int length = srcStr.length();
        if (start >= length || end >= length) {
            return "";
        } else {
            return StrUtil.subByCodePoint(srcStr, start, end);
        }


    }

    /**
     * 将一个byte数组转换为一个十六进制的字符串
     * 示例1：StrUtil.toHexString(new byte[] {127,1,15,-128,0}); 结果：7F010F8000
     * 示例2：StrUtil.toHexString(new byte[] {10,20,30,40,50}); 结果：0A141E2832
     * @param a 要进行转换的byte数组
     * @return 转换完成的字符串
     */
    public static String toHexString(byte a[], int start, int end,char delim)
    {
        if (a == null)
        {
            return null;
        }
        final int n = end - start;
        final char sa[] = new char[delim>0 && n>0 ? n * 3-1 : n * 2];
        for (int j = 0,p=0; j < n; j++)
        {
            if( delim>0 && j>0 ) {
                sa[p++] = delim;
            }
            final int i = start + j;
            int x = (a[i] >> 4) & 0xf;
            sa[p++] = (char) (x < 10 ? '0' + x : 'A' + x - 10);
            x = a[i] & 0xf;
            sa[p++] = (char) (x < 10 ? '0' + x : 'A' + x - 10);
        }
        return new String(sa);
    }


    public static String toHexString(byte a[])
    {
        return a == null ? null : toHexString(a, 0, a.length,(char)0);
    }
}
